define(['router'],function(){
    var lazyLoad = angular.module('lazyLoad',['ui.router']);

    lazyLoad.makeLazy = function(module){
        module.config(['$controllerProvider', '$compileProvider', '$filterProvider', '$provide',
                function($controllerProvider, $compileProvider, $filterProvider, $provide) {
                    module.registerController = $controllerProvider.register;
                    module.registerDirective = $compileProvider.directive;
                    module.registerFilter = $filterProvider.register;
                    module.registerFactory = $provide.factory;
                    module.registerService = $provide.service;
                }
        ]);

        module.configState = function(routerConfig){
            module.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
                angular.forEach(routerConfig.routes, function(route) {
                        $stateProvider.state({
                            name: route.name,
                            url: route.url,
                            templateUrl: route.templateUrl,
                            controller: route.controller,
                            // 设置每个路由的 resolve ， 使用 requirejs 加载 controller 脚本
                            resolve: loader(route.dependencies)
                        });
                })
            }])

            function loader(dependencies) {
                // 返回路由的 resolve 定义，
                var definition = {
                    // resolver 是一个函数， 返回一个 promise 对象；
                    resolver: ['$q', '$rootScope', function($q, $rootScope) {
                        // 创建一个延迟执行的 promise 对象
                        var defered = $q.defer();
                        // 使用 requirejs 的 require 方法加载的脚本
                        require(dependencies, function() {
                            $rootScope.$apply(function() {
                                // 加载完脚本之后， 完成 promise 对象；
                                defered.resolve();
                            });
                        });
                        //返回延迟执行的 promise 对象， route 会等待 promise 对象完成
                        return defered.promise;
                        }]
                    };
                return definition;
            }
        }
    }
    return lazyLoad;
})